package com.itheima.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
    1.获取本次请求
    2.定义不拦截的请求
    3.判断本次请求和定义的不拦截请求是否一样
    4.不需要拦截直接放行
    5.判断是否登录 登陆了直接放行
    6.未登录 直接通过输出流向前端返回未登录的结果
 */
//设置拦截的路径
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
//日志
@Slf4j
public class LoginCheckFilter implements Filter {
    //AntPathMatcher 判断路径是否相同的类
    private static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //request对象
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        //response对象
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        //log.info("本次访问的地址是->"+request.getRemoteAddr());
        if (!"0:0:0:0:0:0:0:1".equals(request.getRemoteAddr())){
            response.getWriter().write("");
        }
        //获取本次请求的URI
        String URI = request.getRequestURI();
        //定义不拦截的请求
        String[] uris=new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**",
                "/user/sendMsg",
                "/user/login"
        };
        //check()定义方法
        //判断是否要拦截本次请求
        boolean check = check(uris, URI);
        //如果相同
        if (check){
            //则放行
            filterChain.doFilter(request,response);
            //放行后后面的就不用执行了 所以使用return方法结束方法
            return;
        }
        //判断是否登录
        //使用request里的session里是否有employee的值 判断session里是否登录
        if (request.getSession().getAttribute("employee")!=null){
            //不为空就放行
            //BaseContext类里有ThreadLocal 判断登录后将登录的id放入BaseContext的ThreadLocal里
            Long empId = (Long)request.getSession().getAttribute("employee");
            BaseContext.set(empId);
            filterChain.doFilter(request,response);
            //放行后后面的就不用执行了 所以使用return方法结束方法
            return;
        }

        if (request.getSession().getAttribute("user")!=null){
            //不为空就放行
            //BaseContext类里有ThreadLocal 判断登录后将登录的id放入BaseContext的ThreadLocal里
            Long userId = (Long)request.getSession().getAttribute("user");
            BaseContext.set(userId);

            filterChain.doFilter(request,response);
            //放行后后面的就不用执行了 所以使用return方法结束方法
            return;
        }


        //用户未登录则打印日志
        log.info("用户未登录");
        //使用response的输出流向前台输出结果
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        //结束方法
        return;

    }

    /**
     * 检查本次路径与不拦截的路径是否相同
     * @param uris
     * @param URI
     * @return
     */
    public boolean check(String[] uris,String URI){
        //遍历不拦截的路径
        for (String uri : uris) {
            //判断后结果返回boolean
            boolean b = PATH_MATCHER.match(uri, URI);
            //如果相同 b为true
            if (b){
                return true;
            }
        }
        return false;
    }
}
